<?php

namespace App\Model\Table;

use Cake\ORM\Table;
use Cake\Validation\Validator;
use Cake\ORM\Query;
use Cake\Utility\Inflector;
use Cake\Filesystem\Folder;
use Cake\Filesystem\File;
use Cake\I18n\Time;

class EmissorasTable extends Table {

    public function initialize(array $config) {
        $this->table('abert_emissora');
    }

    public function findDefault(Query $query, array $options) {
        $where = array();
        $params = $options['options']['conditions'];
        if ($params['codigo_abert'] != null) {
            array_push($where, ['codigo_abert' => $params['codigo_abert']]);
        }
        if ($params['cpf_cnpj'] != null) {
            array_push($where, ['cpf_cnpj' => $params['cpf_cnpj']]);
        }
        if ($params['cidade'] != null) {
            array_push($where, ['cidade ILIKE' => '%' . $params['cidade'] . '%']);
        }
        if ($params['razaosocial'] != null) {
            array_push($where, ['razaosocial ILIKE' => '%' . $params['razaosocial'] . '%']);
        }
        if ($params['nomefantasia'] != null) {
            array_push($where, ['nomefantasia ILIKE' => '%' . $params['nomefantasia'] . '%']);
        }

        return $this->find()->where($where);
    }

    public function setDataFilter($data, $options) {
        $datas = array();
        $params = $options['options']['conditions'];
        if ($params['data_inicial'] != null) {
            $date = date_create_from_format('d/m/Y', $params['data_inicial']);
            $time = new Time($date);
            $datas[$data . ' >='] = $time->i18nFormat('YYYY-MM-dd');
        }
        if ($params['data_final'] != null) {
            $date = date_create_from_format('d/m/Y', $params['data_final']);
            $time = new Time($date);
            $time->addDays(1);
            $datas[$data . ' <='] = $time->i18nFormat('YYYY-MM-dd');
        }

        return $datas;
    }

    public function findNovas(Query $query, array $options) {
        $newQuery = $query->find('default', $options)
                ->where(['situacao_id' => \App\Model\Entity\Situacao::Nova]);

        return $newQuery->order(['nomefantasia' => 'ASC']);
    }

    public function findPendentes(Query $query, array $options) {
        $newQuery = $query->find('default', $options)
                ->where(['situacao_id' => \App\Model\Entity\Situacao::Pendente])
                ->where($this->setDataFilter('data_entrada', $options));

        return $newQuery->order(['data_entrada' => 'ASC']);
    }

    public function findAprovadas(Query $query, array $options) {
        $newQuery = $query->find('default', $options)
                ->where(['situacao_id' => \App\Model\Entity\Situacao::Aprovada])
                ->where($this->setDataFilter('data_aprovacao', $options));

        return $newQuery->order(['data_aprovacao' => 'ASC']);
    }

    public function findAprovadasTotal(Query $query, array $options) {
        $newQuery = $query->find('default', $options)
                ->where(['situacao_id IN' => [ \App\Model\Entity\Situacao::Aprovada,
                        \App\Model\Entity\Situacao::Finalizada,
                        \App\Model\Entity\Situacao::Aguardando,
                        \App\Model\Entity\Situacao::Publicada]
                ])
                ->where($this->setDataFilter('data_aprovacao', $options));

        return $newQuery->order(['data_aprovacao' => 'DESC']);
    }

    public function findRejeitadas(Query $query, array $options) {
        $newQuery = $query->find('default', $options)
                ->where(['situacao_id' => \App\Model\Entity\Situacao::Rejeitada])
                ->where($this->setDataFilter('data_rejeicao', $options));
        return $newQuery->order(['data_rejeicao' => 'DESC']);
    }

    public function findFinalizadas(Query $query, array $options) {
        $newQuery = $query->find('default', $options)
                ->where(['situacao_id' => \App\Model\Entity\Situacao::Finalizada])
                ->where($this->setDataFilter('data_finalizacao', $options));
        return $newQuery->order(['data_finalizacao' => 'ASC']);
    }

    public function findAguardando(Query $query, array $options) {
        $newQuery = $query->find('default', $options)
                ->where(['situacao_id' => \App\Model\Entity\Situacao::Aguardando])
                ->where($this->setDataFilter('data_aguardar', $options));
        return $newQuery->order(['data_aguardar' => 'ASC']);
    }

    public function findpublicadas(Query $query, array $options) {
        $newQuery = $query->find('default', $options)
                ->where(['situacao_id' => \App\Model\Entity\Situacao::Publicada])
                ->where($this->setDataFilter('data_publicacao', $options));
        return $newQuery->order(['data_publicacao' => 'ASC']);
    }

    public function validationDefault(Validator $validator) {
        $validator->notEmpty('cpf_cnpj', 'Campo obrigatório')
                ->add('cpf_cnpj', 'custom', [
                    'rule' => function ($value) {
                        return $this->valida_cnpj($value);
                    }, 'message' => 'CNPJ deve ser válido'])
                ->notEmpty('razaosocial', 'Campo obrigatório')
                ->notEmpty('nomefantasia', 'Campo obrigatório')
                ->notEmpty('cidade', 'Campo obrigatório')
                ->notEmpty('codigo_abert', 'Campo obrigatório')
                ->notEmpty('responsavel_cadastro', 'Campo obrigatório')
                ->notEmpty('departamento_responsavel', 'Campo obrigatório')
                ->notEmpty('telefone_responsavel', 'Campo obrigatório')
                ->notEmpty('cargo_responsavel', 'Campo obrigatório')
                ->notEmpty('email_responsavel', 'Campo obrigatório')
                ->add('email_responsavel', 'validFormat', [
                    'rule' => 'email', 'message' => 'E-mail deve ser válido']);

        return $validator;
    }

    public function validationFinalizar(Validator $validator) {
        $validator->notEmpty('nome_empresa', 'Campo obrigatório')
                ->notEmpty('palavra_chave', 'Campo obrigatório')
                ->notEmpty('mensagem_compartilhamento', 'Campo obrigatório')
                ->notEmpty('latitude', 'Campo obrigatório')
                ->notEmpty('longitude', 'Campo obrigatório')
                ->notEmpty('nome_provedor_streaming', 'Campo obrigatório')
                ->notEmpty('streaming', 'Campo obrigatório')
                ->add('streaming', 'validFormat', ['rule' => 'url', 'message' => 'Link deve ser uma url válida'])
                ->add('facebook', 'validFormat', ['rule' => 'url', 'message' => 'Link deve ser uma url válida'])
                ->allowEmpty('facebook')->allowEmpty('twitter')->allowEmpty('link_rds')->allowEmpty('link_integracao_programacao')
                ->add('link_integracao_programacao', 'validFormat', ['rule' => 'url', 'message' => 'Link deve ser uma url válida'])
                ->add('twitter', 'validFormat', ['rule' => 'url', 'message' => 'Link deve ser uma url válida'])
                ->add('link_rds', 'validFormat', ['rule' => 'url', 'message' => 'Link deve ser uma url válida']);

        return $validator;
    }

    public function validationAlterar(Validator $validator) {
        $validator = $this->validationFinalizar($validator);
        $validator->allowEmpty('email_proprietario')->allowEmpty('website')
                ->add('website', 'validFormat', ['rule' => 'url', 'message' => 'Home Page deve ser uma url válida'])
                ->add('email_proprietario', 'validFormat', ['rule' => 'email', 'message' => 'Email deve ser um email válido']);



        return $validator;
    }

    public function validationPublicar(Validator $validator) {
        $validator->notEmpty('url_loja_ios', 'Campo obrigatório')
                ->notEmpty('url_loja_android', 'Campo obrigatório')
                ->add('url_loja_ios', 'validFormat', ['rule' => 'url', 'message' => 'Link deve ser uma url válida'])
                ->add('url_loja_android', 'validFormat', ['rule' => 'url', 'message' => 'Link deve ser uma url válida']);

        return $validator;
    }

    public function validationAprovar(Validator $validator) {
        $validator->notEmpty('observacao_aprovacao_abert', 'A justificativa é obrigatória');
        return $validator;
    }

    public function validationReprovar(Validator $validator) {
        $validator->notEmpty('observacao_abert', 'A justificativa é obrigatória');
        return $validator;
    }

    function valida_cnpj($value) {
        $cnpj = preg_replace('/[^0-9]/', '', (string) $value);
        if (strlen($cnpj) != 14) {
            return false;
        }

        // Valida primeiro dígito verificador
        for ($i = 0, $j = 5, $soma = 0; $i < 12; $i++) {
            $soma += $cnpj{$i} * $j;
            $j = ($j == 2) ? 9 : $j - 1;
        }

        $resto = $soma % 11;
        if ($cnpj{12} != ($resto < 2 ? 0 : 11 - $resto)) {
            return false;
        }

        // Valida segundo dígito verificador
        for ($i = 0, $j = 6, $soma = 0; $i < 13; $i++) {
            $soma += $cnpj{$i} * $j;
            $j = ($j == 2) ? 9 : $j - 1;
        }

        $resto = $soma % 11;
        return $cnpj{13} == ($resto < 2 ? 0 : 11 - $resto);
    }

    public function saveLogo($entity, $submittedfile) {
        $dir = 'img' . DS . 'upload';
        $dir = WWW_ROOT . $dir . DS;

        if (($submittedfile['error'] != 0) and ( $submittedfile['size'] == 0)) {
            if (!$entity['logo']) {
                $entity->addError('logo', 'Arquivo obrigatório');
                return false;
            }
            return true;
        }

        $info = pathinfo($dir . $submittedfile['name']);

        $file = new File($submittedfile['tmp_name']);
        $mime = $file->mime();
        if ($mime != 'image/png') {
            $entity->addError('logo', 'Tipo de arquivo inválido');
            return false;
        }

        $imagesize = getimagesize($submittedfile['tmp_name']);
        if ($imagesize[0] != 1024 || $imagesize[1] != 1024) {
            $entity->addError('logo', 'Imagem com resolução inválida');
            return false;
        }

        $filename = 'logo-emissora-' . $entity['id'] . '.' . $info['extension'];
        if (!$file->copy($dir . $filename)) {
            $entity->addError('logo', 'Problema ao salvar arquivo');
            return false;
        }
        $file->close();
        $entity->set('logo', $filename);
        return true;
    }

}
